package com.example.jetpacktest.generic

class GenericTest001 {

    /**
     * 协变的测试，Int和String是Any的子类型（注意，子类型不一定是子类， 子类一定是子类型）
     * 子类型定义的规则一般是这样的: 任何时候如果需要的是A类型值的任何地方，都可以使用B类型的值来替换的，
     * 那么就可以说B类型是A类型的子类型或者称A类型是B类型的超类型。可以明显看出子类型的规则会比子类规则更为宽松
     * Int和String是Any的子类型，所以List<Int>和List<String>是List<Any>的子类型，这称为协变
     */
    fun test001(){
        //List是协变的, public interface List<out E> : Collection<E> {
        val list1: List<Int> = listOf(1, 2, 3, 4, 5)
        val list2: List<String> = listOf("a", "b", "c", "d")
        myPrint1(list1)
        myPrint1(list2)

        //MutableList不是协变的, public interface MutableList<E> : List<E>, MutableCollection<E> {
        val list3: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)
        val list4: MutableList<String> = mutableListOf("a", "b", "c", "d")
        //myPrint2(list3) //编译会报错
        //myPrint2(list4) //编译会报错
    }

    fun myPrint1(list: List<Any>){
        list.forEach {
            println("$it")
        }
    }

    fun myPrint2(list: MutableList<Any>){
        list.forEach {
            println("$it")
        }
    }


    companion object{

        @JvmStatic
        fun main(args: Array<String>){
            val genericTest001: GenericTest001 = GenericTest001()
            genericTest001.test001()
        }
    }

}


